#include <reg52.h> 

// 延时函数，用于控制流水灯流动速度
void delay(unsigned int i) { 
    while (i--); 
}

void main() {
    // 顺时针循环表：定义16个步骤中P2和P3口的状态
    // 格式：{P2状态, P3状态}，低电平点亮P2，高电平点亮P3
    unsigned char clockwise_table[16][2] = {
        {0xFE, 0x00},  // 步骤1: P2.0亮
        {0xFD, 0x00},  // 步骤2: P2.1亮
        {0xFB, 0x00},  // 步骤3: P2.2亮
        {0xF7, 0x00},  // 步骤4: P2.3亮
        {0xEF, 0x00},  // 步骤5: P2.4亮
        {0xDF, 0x00},  // 步骤6: P2.5亮
        {0xBF, 0x00},  // 步骤7: P2.6亮
        {0x7F, 0x00},  // 步骤8: P2.7亮
        {0xFF, 0x01},  // 步骤9: P3.0亮
        {0xFF, 0x02},  // 步骤10: P3.1亮
        {0xFF, 0x04},  // 步骤11: P3.2亮
        {0xFF, 0x08},  // 步骤12: P3.3亮
        {0xFF, 0x10},  // 步骤13: P3.4亮
        {0xFF, 0x20},  // 步骤14: P3.5亮
        {0xFF, 0x40},  // 步骤15: P3.6亮
        {0xFF, 0x80}   // 步骤16: P3.7亮
    };

    int step = 0;  // 当前步骤索引

    while (1) {
        // 从循环表中获取当前步骤的P2和P3状态
        P2 = clockwise_table[step][0];  // 设置P2口状态（低电平点亮）
        P3 = clockwise_table[step][1];  // 设置P3口状态（高电平点亮）
        
        delay(100000);  // 延时控制速度
        
        // 更新步骤索引，实现循环
        step = (step + 1) % 16;  // 当step=15后，自动回到0
    }
}